home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Collections: Auge 4000
/
Auge 4000 #06 (1987-05-23)(Amiga User Gruppe Einzugsgebiet 4000).zip
/
Auge 4000 #06 (1987-05-23)(Amiga User Gruppe Einzugsgebiet 4000).adf
/
Tips&Tricks
/
setfont.c
< prev
next >
Wrap
C/C++ Source or Header
|
1987-03-08
|
5KB
|
213 lines
/*
Find CON: window pointer and set its font
by A. Finkel, R. Burns, and M. McInerny
)1986 by Commodore-Amiga and M. McInerny.
*/
#include "exec/types.h"
#include "exec/nodes.h"
#include "exec/ports.h"
#include "exec/io.h"
#include "exec/memory.h"
#include "devices/console.h"
#include "devices/conunit.h"
#include "libraries/dos.h"
#include "libraries/dosextens.h"
#include "intuition/intuitionbase.h"
#include "workbench/startup.h"
#include "workbench/workbench.h"
#include "graphics/rastport.h"
#include "graphics/text.h"
#include "libraries/diskfont.h"
extern struct Library *OpenLibrary();
extern struct TextFont *OpenDiskFont();
struct IntuitionBase *IntuitionBase = 0;
long GfxBase = 0;
long DiskfontBase = 0;
struct TextFont *font;
struct MsgPort iorp = {
{0, 0, NT_MSGPORT, 0, 0}, 0,
-1, /* initialize signal to -1 */
0, /* start with empty list */
{(struct Node *)&iorp.mp_MsgList.lh_Tail, 0,
(struct Node *)&iorp.mp_MsgList.lh_Head, 0, 0}
};
struct IOStdReq ior = {
{{0, 0, 0, 0, 0}, &iorp, 0},
0 /* device is zero */
};
void OpenLibs()
{
GfxBase = (long)OpenLibrary("graphics.library", 0);
if (GfxBase == NULL) {
printf("Graphics library open failed.\n");
cleanup(20);
}
if ((IntuitionBase = (struct IntuitionBase *)
OpenLibrary("intuition.library", 0)) == 0) {
cleanup(21);
}
DiskfontBase = (long)OpenLibrary("diskfont.library", 0);
if (DiskfontBase == NULL) {
printf("Diskfont library open failed.\n");
cleanup(25);
}
}
struct Window *GetWindow()
{
struct MsgPort *con;
struct StandardPacket *packet = 0;
struct InfoData *id = 0;
struct Window *windw = 0;
/* open the console device, returns address of device handler */
if ((OpenDevice("console.device", -1, &ior, 0)) != 0) {
cleanup(30);
}
/* set up the message port in the I/O request */
if ((iorp.mp_SigBit = AllocSignal(-1)) < 0) {
cleanup(35);
}
/* which task am I? */
iorp.mp_SigTask = (struct Task *) FindTask((char *) NULL);
/* Try to find the console associated with calling process */
if (iorp.mp_SigTask->tc_Node.ln_Type == NT_PROCESS) {
con = (struct MsgPort *)
((struct Process *) iorp.mp_SigTask)->pr_ConsoleTask;
if (con != 0) {
if (packet = (struct StandardPacket *)
AllocMem(sizeof(*packet), MEMF_CLEAR)) {
if (id = (struct InfoData *)AllocMem(sizeof(*id), MEMF_CLEAR)) {
/* This is the console handlers packet port. */
packet->sp_Msg.mn_Node.ln_Name = (char *)&(packet->sp_Pkt);
packet->sp_Pkt.dp_Link = (struct Message *)&(packet->sp_Pkt);
packet->sp_Pkt.dp_Port = &iorp;
packet->sp_Pkt.dp_Type = ACTION_DISK_INFO;
packet->sp_Pkt.dp_Arg1 = ((ULONG) id) >> 2; /* #@!% BPTR! */
PutMsg(con, packet);
WaitPort(&iorp);
windw = (struct Window *) (id->id_VolumeNode);
FreeMem(id, sizeof(*id));
}
FreeMem(packet, sizeof(*packet));
}
}
}
ior.io_Unit = (struct Unit *) -1;
return(windw);
}
cleanup(code)
int code;
{
if (ior.io_Device != 0) {
if (iorp.mp_SigBit != -1) {
FreeSignal(iorp.mp_SigBit);
}
CloseDevice(&ior);
}
if (font) CloseFont(font);
if (DiskfontBase) CloseLibrary(DiskfontBase);
if (IntuitionBase) CloseLibrary(IntuitionBase);
if (GfxBase) CloseLibrary(GfxBase);
exit(code);
}
main(argc, argv)
int argc;
char *argv[];
{
struct TextAttr *ta = 0;
struct TextAttr *old_ta;
struct TextFont *oldfont;
struct Window *win;
struct RastPort *rp;
int fontsize = 8;
char *fontname;
int i,
screen_flag = 0,
rast_flag = 0;
if (*argv[1] == '?')
{
printf(
"Usage: %s [fontname=topaz [fontsize=8]] [-s=set screen] [-r=set rastport]\n",
argv[0]);
printf("v1.1 )1986 by M. McInerny and Commodore-Amiga.\n");
cleanup(10);
}
#define FBUFSIZE 40
fontname = (char *)AllocMem(FBUFSIZE, MEMF_CLEAR);
if (argc>1) {
fontname = (char *)strncpy(fontname, argv[1], FBUFSIZE);
fontname = (char *)strncat(fontname, ".font", FBUFSIZE);
} else {
fontname = (char *)strncpy(fontname, "topaz.font", FBUFSIZE);
screen_flag = 1; /* restore the screen to normal */
rast_flag = 1;
}
if ((argc>2) && (*argv[2] != '-')) fontsize = atoi(argv[2]);
for (i = 1; i < argc; ++i)
if (*argv[i] == '-')
switch (*(argv[i]+1)) {
case 's': screen_flag = 1; break;
case 'r': rast_flag = 1; break;
}
OpenLibs();
ta = (struct TextAttr *)AllocMem(sizeof(*ta), MEMF_CLEAR);
ta->ta_Name = fontname;
ta->ta_YSize = fontsize;
ta->ta_Style = 0;
ta->ta_Flags = FPF_DISKFONT;
font = OpenDiskFont(ta);
if (font == 0)
{
printf("OpenDiskFont failed--font not found?\n");
cleanup(27);
}
win = GetWindow();
if (!win) cleanup(40);
if (screen_flag == 1) {
old_ta = win->WScreen->Font;
win->WScreen->Font = ta;
FreeMem(old_ta, sizeof(old_ta));
} else FreeMem(ta, sizeof(ta));
if (rast_flag == 1) {
rp = &(win->WScreen->RastPort);
oldfont = rp->Font;
if (SetFont(rp, font) != 0)
CloseFont(oldfont);
}
rp = win->RPort;
oldfont = rp->Font;
/* If the SetFont() works, on cleanup, CloseFont(oldfont) */
if (SetFont(rp, font) != 0) {
font = oldfont;
printf("\033c");
}
cleanup(0);
}